package com.itheima.reggie.controller;

import com.itheima.reggie.common.R;
import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.UUID;

/**
 * 处理文件上传下载
 */
@RestController
@RequestMapping("common")
public class CommonController {

    @Value("${reggie.path}")
    private String filePath; // 文件上传后保存路径

    /**
     * 上传文件
     * @param multipartFile
     * @return
     * @throws IOException
     */
    @PostMapping("upload")
    public R<String> upload(@RequestParam("file") MultipartFile multipartFile) throws IOException {
        // 判断是否上传文件
        if (multipartFile == null || multipartFile.isEmpty()) {
            return R.error("未上传文件");
        }
        // 创建文件目录对象
        File file = new File(filePath);
        // 判断保存文件的目录是否已存在
        if (!file.exists()) {
            file.mkdirs();
        }
        // 获取上传的原始文件名
        String originalFilename = multipartFile.getOriginalFilename();
        if (originalFilename == null) {
            return R.error("上传的文件名为空");
        }
        // 获取原始文件后缀名
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
        // 生成新文件名
        String newFileName = UUID.randomUUID() + suffix;
        // 保存文件至服务器硬盘
        multipartFile.transferTo(new File(file, newFileName));
        return R.success(newFileName);
    }

    /**
     * 下载服务器文件
     * @param name
     * @param response
     * @throws IOException
     */
    @GetMapping("download")
    public void download(String name, HttpServletResponse response) throws IOException {
        // 浏览器下载文件
//        response.setHeader("content-disposition", "attachment;filename="+name);
        File file = new File(filePath);
        // 创建字节输入流对象读取上传到服务器中的文件
        FileInputStream inputStream = new FileInputStream(new File(file, name));
        // 获取响应字节流输出对象
        ServletOutputStream outputStream = response.getOutputStream();
        // 响应文件
        IOUtils.copy(inputStream, outputStream);
        // 释放资源
        inputStream.close();
    }
}
